package com.ckcool.api.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.*;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.time.ZoneId;
import java.util.List;
import java.util.Map;
import java.util.TimeZone;

@Component
@Slf4j
public class JsonUtil {


    /**
     * 获取第一个key
     *
     * @param jsonObject
     * @return
     */
    public static Boolean containsKeysIgnoreCase(JSONObject jsonObject, String... keys) {
        try {
            Map<String, Object> filter = MapUtil.filter(jsonObject, m -> StrUtil.equalsAnyIgnoreCase(m.getKey(), keys));
            return MapUtil.isNotEmpty(filter);
        } catch (Exception ex) {
            return false;
        }
    }

    /**
     * 获取第一个key
     *
     * @param jsonObject
     * @return
     */
    public static String getFirstKeySafe(JSONObject jsonObject) {
        String jsonKey = StrUtil.EMPTY;
        try {
            //空的也显示
            jsonKey = CollUtil.getFirst(jsonObject.keySet());
        } catch (Exception ex) {
        } finally {
            return jsonKey;
        }
    }

    /**
     * 获取第一个key
     *
     * @param jsonObject
     * @return
     */
    public static String getFirstValueSafe(JSONObject jsonObject) {
        String jsonKey = StrUtil.EMPTY;
        try {
            //空的也显示
            jsonKey = getObjectToString(CollUtil.getFirst(jsonObject.values()));
        } catch (Exception ex) {
        } finally {
            return jsonKey;
        }
    }


    /**
     * 功能描述：把JSON数据转换成指定的java对象
     *
     * @param jsonData JSON数据
     * @param clazz    指定的java对象
     * @return 指定的java对象
     */
    public static <T> T getJsonToBean(String jsonData, Class<T> clazz) {
        return JSON.parseObject(jsonData, clazz);
    }

    /**
     * 功能描述：把JSON数据转换成指定的java对象
     *
     * @param jsonData JSON数据
     * @param clazz    指定的java对象
     * @return 指定的java对象
     */
    public static <T> T getJsonToBeanSafe(String jsonData, Class<T> clazz) {
        try {
            return JSON.parseObject(jsonData, clazz);
        } catch (Exception ex) {
            return null;
        }
    }


    /**
     * 功能描述：把JSON数据转换成JSONArray数据
     *
     * @param json
     * @return
     */
    public static JSONArray getJsonToJsonArray(String json) {
        return JSONArray.parseArray(json);
    }


    /**
     * 功能描述：把JSON数据转换成JSONArray数据
     *
     * @param json
     * @return
     */
    public static JSONArray getJsonToJsonArray(Object json) {
        return JSONArray.parseArray(getObjectToString(json));
    }


    /**
     * 功能描述：把JSON数据转换成JSONArray数据
     *
     * @param json
     * @return
     */
    public static JSONArray getJsonToJsonArraySafe(Object json) {
        try {
            return JSONArray.parseArray(getObjectToString(json));
        } catch (Exception ex) {
            return null;
        }
    }

    /**
     * 功能描述：把JSON数据转换成指定的java对象列表
     *
     * @param res  res对象
     * @param path 路径
     * @return List<T>
     */
    public static JSONArray getJsonToJsonArraySafe(Object res, String path) {
        try {
            Object eval = JSONPath.eval(res, path, true);
            return getJsonToJsonArray(eval);
        } catch (Exception ex) {
            return null;
        }
    }

    /**
     * 功能描述：把List数据转换成JSONArray数据
     *
     * @param list
     * @param <T>
     * @return
     */
    public static <T> JSONArray getListToJsonArray(List<T> list) {
        return JSONArray.parseArray(JsonUtil.getObjectToString(list));
    }

    /**
     * 功能描述：把java对象转换成JSON数据
     *
     * @param object java对象
     * @return JSON数据
     */
    public static String getObjectToString(Object object) {
        return JSON.toJSONString(object, SerializerFeature.WriteMapNullValue);
    }

    /**
     * 功能描述：把java对象转换成JSON数据
     *
     * @param object java对象
     * @return JSON数据
     */
    public static String getObjectToStringOrNull(JSONObject object) {
        return MapUtil.isNotEmpty(object) || CollUtil.size(object) > 0 ? getObjectToString(object) : null;
    }

    /**
     * 功能描述：把java对象转换成JSON数据,时间格式化
     *
     * @param object java对象
     * @return JSON数据
     */
    public static String getObjectToStringDateFormat(Object object, String dateFormat) {
        JSON.defaultTimeZone = TimeZone.getTimeZone(ZoneId.of("+8"));
        return JSON.toJSONStringWithDateFormat(object, dateFormat, SerializerFeature.WriteMapNullValue);
    }

    /**
     * 功能描述：把JSON数据转换成指定的java对象列表
     *
     * @param jsonData JSON数据
     * @param clazz    指定的java对象
     * @return List<T>
     */
    public static <T> List<T> getJsonToList(String jsonData, Class<T> clazz) {
        return JSON.parseArray(jsonData, clazz);
    }


    /**
     * 功能描述：把JSONArray数据转换成较为复杂的List<Map<String, Object>>
     *
     * @param jsonArray JSONArray数据
     * @return List<JSONObject>
     */
    public static List<JSONObject> getJsonToList(JSONArray jsonArray) {
        return JSON.parseObject(JSON.toJSONString(jsonArray), new TypeReference<List<JSONObject>>() {
        });
    }

    /**
     * 功能描述：把JSONArray数据转换成较为复杂的List<Map<String, Object>>
     *
     * @param jsonArray JSONArray数据
     * @return List<Map < String, Object>>
     */
    public static List<JSONObject> getJsonToList(String jsonArray) {
        return JSON.parseObject(jsonArray, new TypeReference<List<JSONObject>>() {
        });
    }

    /**
     * 功能描述：把JSON数据转换成指定的java对象
     *
     * @param dto   dto对象
     * @param clazz 指定的java对象
     * @return 指定的java对象
     */
    public static <T> T getJsonToBean(Object dto, Class<T> clazz) {
        return JSON.parseObject(getObjectToString(dto), clazz);
    }

    /**
     * 功能描述：把JSON数据转换成指定的java对象
     *
     * @param dto   dto对象
     * @param clazz 指定的java对象
     * @return 指定的java对象
     */
    public static <T> T getJsonToBeanSafe(Object dto, Class<T> clazz) {
        try {
            return JSON.parseObject(getObjectToString(dto), clazz);
        } catch (Exception ex) {
            return null;
        }

    }


    /**
     * 功能描述：把JSON数据转换成指定的java对象列表
     *
     * @param res   res对象
     * @param path  路径
     * @param clazz 指定的java对象
     * @return List<T>
     */
    public static <T> T getJsonToBeanSafe(Object res, String path, Class<T> clazz) {
        try {
            Object eval = JSONPath.eval(res, path, true);
            return JsonUtil.getJsonToBean(eval, clazz);
        } catch (Exception ex) {
            return null;
        }
    }


}
